
public class ArrayList implements List {

// Instance variables
    private Object[] items;
    private int size;

// Constructor
    public ArrayList() {
	clear();
    }

// Returning the size of the list
    public int size() {
	return size;
    }

// Cleaning up / Flushing the list
    public void clear() {
	size = 0;
	items = new Object[1];
    }

 // Checking whether the list is empty
   public boolean isEmpty() {
	return size == 0;
    }

// Adding an element to the list
    public boolean add(Object x) {
	if (size >= items.length) {
	    Object[] copy = new Object[items.length * 2];
	    for (int i = 0; i < size; i++)
		copy[i] = items[i];
	    items = copy;
	}
	items[size] = x;
	size++;
	return true;
    }

// Returning the position of some element
    public int indexOf(Object x) {
	for (int i = 0; i < size; i++)
	    if (items[i].equals(x))
		return i;
	return -1;
    }

// Removing an element from the list
    public boolean remove(Object x) {
	int position = indexOf(x);
	if (position != -1) {
	    for (int i = position; i < size-1; i++)
		items[i] = items[i+1];
	    size--;
	}
	return position != -1;
    }

// Finding out whether some element is in the list
    public boolean contains(Object x) {
	return indexOf(x) != -1;
    }

// Transforming the list into an array of objects
    public Object[] toArray() {
	Object[] array = new Object[size];
	for (int i = 0; i < size; i++)
	    array[i] = items[i];
	return array;
    }

// Displaying the contents of the list
    public String toString() {
	String s = "[";
	for (int i = 0; i < size; i++) {
	    s += items[i];
	    if (i < size-1)
		s += ", ";
	}
	return s + "]";
    }

// Returning the element at position index
    public Object get(int index) {
	return items[index];
    }

// Setting the "value" of the element at position index
    public Object set(int index, Object element) {
	Object item = items[index];
	items[index] = element;
	return item;
    }

// Public iterator (for users of ArrayList)
    public Iterator iterator() {
	return new ArrayListIterator();
    }

// Private implementation of ArrayList's iterator
    private class ArrayListIterator implements Iterator {
	private int current;
	ArrayListIterator() {
	    current = 0;
	}
	public boolean hasNext() {
	    return current < size;
	}
	public Object next() {
	    return items[current++];
	}
    }
}

